local string_unpack = string.unpack
local select = select
local table = table


Binary_reader = {}
local mt = {}
Binary_reader.__index = mt
setmetatable(Binary_reader, mt)

--[[
<: 设为小端编码 
>: 设为大端编码 
=: 大小端遵循本地设置 
![n]: 将最大对齐数设为 n （默认遵循本地对齐设置） 
b: 一个有符号字节 (char) 
B: 一个无符号字节 (char) 
cn: n字节固定长度的字符串 
h: 一个有符号 short （本地大小） 
H: 一个无符号 short （本地大小） 
l: 一个有符号 long （本地大小） 8位，64字节
L: 一个无符号 long （本地大小） 
j: 一个 lua_Integer 
J: 一个 lua_Unsigned 
T: 一个 size_t （本地大小） 
i[n]: 一个 n 字节长（默认为本地大小）的有符号 int 
I[n]: 一个 n 字节长（默认为本地大小）的无符号 int 
f: 一个 float （本地大小） 	8位，64字节
d: 一个 double （本地大小） 16位，128字节
n: 一个 lua_Number 
z: 零结尾的字符串 
s[n]: 长度加内容的字符串，其长度编码为一个 n 字节（默认是个 size_t） 长的无符号整数。 
x: 一个字节的填充 
Xop: 按选项 op 的方式对齐（忽略它的其它方面）的一个空条目
]]


--position永远指向下一个未读的位置
mt.position = 1

--hex：16进制的string
function Binary_reader.new( hex )
	local self = setmetatable({}, Binary_reader)
	self.file_string = hex

	return self
end

function mt:read(type)
	local t = { string_unpack(type, self.file_string, self.position) }
	self.position = t[#t]
	t[#t] = nil

	return table.unpack(t)
end
function mt:advance(n)
	self.position = self.position + n
end